#ifndef ROBOT_H
#define ROBOT_H
#include <iostream>
#include <list>

#include "global.h"
#include "berth.h"

// 机器人
struct Robot{
    Point p;
    Berth* belonging; // 机器人所属港口
    int cargo;        // 0:未携带物品, 1：携带物品
    int status;       // 0:恢复状态  , 1：正常运行

    int dead;         // 由于避障失败，进入死亡状态，变成墙壁
    char map_restore; // 用于复活的时候修复地图

    // int wait_count; // Optimize3:等了多少帧了，避免头顶头卡死

    Point target;           // 机器人的目的地
    Point pre[2];           // 机器人上一帧所在位置，用于退避，最多退两步
    std::list<Point> route; // 前往目的地的路径
    
    friend std::istream& operator>>(std::istream& in, Robot& robot){
        in >> robot.cargo >> robot.p.x >> robot.p.y >> robot.status;
        return in;
    }
    friend std::ostream& operator<<(std::ostream& out, Robot& robot){
        out << "[robot(" << robot.p.x << " " << robot.p.y << "), cargo: " << robot.cargo << ", status: " << robot.status << "]";
        return out;
    }
    Robot() : dead(0), belonging(nullptr){
        pre[0] = Point(-1, -1);
        pre[1] = Point(-1, -1);
        target = Point(-1, -1);
    }

    bool ArriveAtBerth();   // 到港口了吗
    void Deliver(int i);    // 机器人i交货
    void SetRouteToCargo(); // 将路径设置到离绑定Berth最近的Cargo
    void SetRouteToBerth(); // 将路径设置到绑定的Berth
    void ReBindBerth();     // 绑定港口
    void ResetRoute();      // 重新生成到Target的路劲
    void AvoidCollision(int i, Point &next, bool &retreat); // 避撞
    void Go(int i, const Point& next, bool retreat);        // 移动到下一点: next
};

bool CanGo(Point p);
#endif